package ar.com.larreta.comunes;

import java.lang.reflect.InvocationTargetException;

import org.apache.commons.beanutils.PropertyUtils;

import ar.com.larreta.excepciones.Excepcion;

//FIXME: Ver si es posible llevar todos estos metodos estaticos a implementarlos en alguna clase que los use
// Son demasiados metodos estaticos en una clase que solo los agrupa
public abstract class Herramientas extends Objeto{
	
	public static Object valor(Object objeto, String nombre){
		try {
			return PropertyUtils.getProperty(objeto, nombre);
		} catch (IllegalAccessException e) {
			getLogger(Herramientas.class).error(Excepcion.getStackTrace(e));
		} catch (InvocationTargetException e) {
			getLogger(Herramientas.class).error(Excepcion.getStackTrace(e));
		} catch (NoSuchMethodException e) {
			getLogger(Herramientas.class).error(Excepcion.getStackTrace(e));
		}
		
		return null;
	}
	
	public static Class getClase(String nombreClase){
		try {
			return Class.forName(nombreClase);
		} catch (ClassNotFoundException e) {
			getLogger(Herramientas.class).error(Excepcion.getStackTrace(e));
		}
		return null;
	}
	
	public static Object getObjeto(String nombreClase){
		try {
			return getClase(nombreClase).newInstance();
		} catch (InstantiationException e) {
			getLogger(Herramientas.class).error(Excepcion.getStackTrace(e));
		} catch (IllegalAccessException e) {
			getLogger(Herramientas.class).error(Excepcion.getStackTrace(e));
		}
		return null;
	}
	
	/**
	 * Evalua si la clase origen tiene como clase padre dentro de su arbol jerarquico a la clase subTipo
	 * @param origen
	 * @param subTipo
	 * @return
	 */
	public static Boolean esDelTipo(Class origen, Class subTipo){
		try {
			origen.asSubclass(subTipo);
			return Boolean.TRUE;
		} catch (ClassCastException e) {
			return Boolean.FALSE;
		}
	}
	
}
